package com.daji.concurrency.multithread_threadpool;


//TODO 参考资料：https://jimmysun.blog.csdn.net/article/details/95225769 一定要看
//TODO 参考资料：https://jimmysun.blog.csdn.net/article/details/95225769 一定要看
//TODO 参考资料：https://jimmysun.blog.csdn.net/article/details/95225769 一定要看

import java.util.concurrent.*;

// D02_ThreadPoolBasic 的创建线程池的方式比较简便，但是现在不推荐了。
// 现在写一个项目示例：项目上使用这个作为线程池。
public class D02_ThreadPoolBasic2 {

    //创建线程池
    public static final ExecutorService executorService =
            new ThreadPoolExecutor(
                    9,
                    50,
                    60L,
                    TimeUnit.SECONDS,
                    new ArrayBlockingQueue<>(50),
                    new ThreadPoolExecutor.AbortPolicy());


    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //使用线程池提交任务，submit方法既可以传入runnable也可以传入callable。下面是实现了runnable
        executorService.submit(() -> {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("执行了一个长任务。。。。。");
        });


        //使用线程池提交任务，这里是传入callable。callable带返回值，返回值是一个future类型。这是一个阻塞式回调的案例
        //这是一个阻塞式回调的案例
        //本来想举一个例子使用CompletableFuture异步回调，但是不行。待更新
        Future<String> submit = executorService.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "这是callable的返回值";
            }
        });

        String s = submit.get();    //得到返回值
        System.out.println(s);
        System.out.println("主线程继续处理其它逻辑");
    }
}
